package com.clicacao.clicacao;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.clicacao.library.ClicacaoFunctions;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class AdventureBagScreen extends Activity {
	
	//Variaveis que veem da screen anterior
	String uid; //User id
	String aid; //Adventure id
	String umid; //User mochila id
	String latitude;
	String longitude;
	
	//Variaveis para manipulacao de nomes de arquivos
	String mediaDir;
	String mediaPath;
	String tipo_upi;
	File media;
	MediaPlayer mediaPlayer;

	//ListView
	ListView listView;
	
	//Para trabalhar com o listview
	ArrayList<HashMap<String, String>> upilist;
	ArrayList<HashMap<String, String>> objectlist;
	HashMap<String, String> upi;
	HashMap<String, String> object;
	
	//Botoes
	Button btnLargar;
	Button btnUpis;
	Button btnItens;
	
	//Contexto
	Context context;
	
	//Bundle savedInstanceState
	Bundle bundle;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.adventure_bag_screen);	
		
		bundle = savedInstanceState;
		//Contexto da aplicacao
		context = this;
		
		//Primeiro pega as variaveis necessarias para obter objetos e UPIs do usuario
		uid = getIntent().getExtras().getString("uid");
		umid = getIntent().getExtras().getString("umid");
		aid = getIntent().getExtras().getString("aid");
		latitude = getIntent().getExtras().getString("latitude");
		longitude = getIntent().getExtras().getString("longitude");
		
		//Toast.makeText(getApplicationContext(), "Variaveis retornadas: " + latitude, Toast.LENGTH_SHORT).show();
		
		//Quando eh carregada pela primeira vez, a tela mostra as UPIs que estao na mochila do usuario
		//Pega o listview que existe na screen
		listView = (ListView)findViewById(R.id.lsvMochilaUsuario);
		
		//Inicializando os botoes
		btnLargar = (Button)findViewById(R.id.btnDrop);
		btnUpis = (Button)findViewById(R.id.btnAdventureUpis);
		btnItens = (Button)findViewById(R.id.btnAdventureItens);
		
		//O botao de largar fica desabilitado inicialmente
		btnLargar.setVisibility(Button.INVISIBLE);
		
		//Programo o que deve acontecer quando se clicar para largar um Item
		btnItens.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				//Carrego os Itens
				//Buscando o json no servidor com uma asynctask
				new AsyncTask<Void, Void, JSONObject>(){
					
					ClicacaoFunctions clicacaoFunctions;
					
					@Override
					protected JSONObject doInBackground(Void... params) {
						JSONObject json;
						clicacaoFunctions = new ClicacaoFunctions();
						json = clicacaoFunctions.getUserBagObjects(umid);
						return json;
					}
					
					@Override
					protected void onPostExecute(JSONObject result) {
						super.onPostExecute(result);
						//Acabo com a mensagem de carregando
						//Com a resposta json obtida, fazemos o parser para preencher o listview
						try {
							//Confere para ver se o resultado foi positivo
							objectlist = new ArrayList<HashMap<String,String>>();
							if(result.getString("success").equals("1")){
								JSONArray json_objects_array = result.getJSONArray("objeto");
								if(json_objects_array.isNull(0)){
									//Nao encontrou nenhum objeto para o usuario
									Toast.makeText(getApplicationContext(), "Usuario nao possui nenhum OBJETO em sua mochila!", Toast.LENGTH_SHORT).show();
								}else{//Preenche o listview
									Integer i = Integer.valueOf(0);
									for(i = 0; i < json_objects_array.length(); i++){
										object = new HashMap<String, String>();
										JSONObject json_object = json_objects_array.getJSONObject(i);
										//upi.put("upiid", json_upi.getString("upiid"));
										object.put("tipo_objeto", json_object.getString("tipo_objeto"));
										object.put("nome", json_object.getString("nome"));
										object.put("dono", json_object.getString("id_usuario"));
										object.put("_id", json_object.getString("oid"));
										objectlist.add(object);
									}
								}
							}
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						//Hora de preencher o listview
						//Primeiro confere para ver se objectlist nao esta vazio
						if(!objectlist.isEmpty()){
							String campos[] = {"_id", "dono", "nome", "tipo_objeto"};
							int layout[] = {R.id.tvIdObject,
											R.id.tvTipoObject, 
											R.id.tvNomeObject, 
											R.id.tvIdUser};
							
							ListAdapter listAdapter = new SimpleAdapter(getApplicationContext(), 
																			objectlist, 
																			R.layout.adventure_bag_object_row, 
																			campos, 
																			layout);
							
							try{
								listView.setAdapter(listAdapter);
							}catch(Exception e){
								e.printStackTrace();
							}
							
							listView.setLongClickable(true);
							listView.setOnItemLongClickListener(new OnItemLongClickListener() {
	
								public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
									//Aqui vou visualizar a UPI que esta na lista
									final AdapterView<?> av = parent;
									final int positionToDrop = position; 
									
									AlertDialog.Builder adb = new AlertDialog.Builder(context);
									//Log.e("DIALOG", "TESTE");
									adb.setTitle("Largar OBJETO");
									adb.setMessage("Largar OBJETO na aventura?");
									adb.setNegativeButton("Nao", null);
									adb.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
										
										public void onClick(DialogInterface dialog, int which) {
											//Toast.makeText(getApplicationContext(), "Dropar UPI " + id1, Toast.LENGTH_SHORT).show();
											HashMap<String, String> lista = new HashMap<String, String>();
											lista = (HashMap<String, String>)av.getItemAtPosition(positionToDrop);
											final String objectid = lista.get("_id").toString();
											//Mudando parametros para representar que larguei a UPI na aventura
											//Para isto preciso de uma thread assincrona
											new AsyncTask<Void, Void, JSONObject>(){
												
												ClicacaoFunctions clicacaoFunctions;
												
												@Override
												protected JSONObject doInBackground(
														Void... params) {
													clicacaoFunctions = new ClicacaoFunctions();
													JSONObject json = clicacaoFunctions.dropObjectToAdventure(objectid, aid, latitude, longitude);
													return json;
												}
	
												@Override
												protected void onPostExecute(
														JSONObject result) {
													//Analisa o JSON para ver se a operacao foi bem sucedida
													super.onPostExecute(result);
													
													try{
														if(result.getString("success").equalsIgnoreCase("1")){
															Toast.makeText(getApplicationContext(), "O OBJETO foi largado no mapa com sucesso!", Toast.LENGTH_SHORT).show();
														}else{
															Toast.makeText(getApplicationContext(), "Nao foi possivel largar o OBJETO!", Toast.LENGTH_SHORT).show();
														}
													}catch(JSONException e){
														e.printStackTrace();
													}
													
													onDestroy();
													
												}
												
											}.execute();
										}
									});
									adb.show();
									
									return false;
								}
							
							});
							
							listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	
								public void onItemClick(AdapterView<?> parent, View view,
										int position, long id) {
									//Toast.makeText(getApplicationContext(), "UPI " + parent.getItemIdAtPosition(position), Toast.LENGTH_SHORT).show();
								}
						
							});
						}
					}
				}.execute();
			}
		});
		
		
		//Programo o que deve acontecer quando se clicar para ver as UPIs
		btnUpis.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				//Carrego as UPIs
				//Buscando o json no servidor com uma asynctask
				new AsyncTask<Void, Void, JSONObject>(){
					
					ClicacaoFunctions clicacaoFunctions;
					
					//private ProgressDialog progressDialog = new ProgressDialog(getApplicationContext());

					@Override
					protected JSONObject doInBackground(Void... params) {
						JSONObject json;
						clicacaoFunctions = new ClicacaoFunctions();
						json = clicacaoFunctions.getUserBagUpis(umid);
						return json;
					}
					
					@Override
					protected void onPreExecute() {
						super.onPreExecute();
						//progressDialog.setMessage("Carregando UPIs ...");
						//progressDialog.show();
					}

					@Override
					protected void onPostExecute(JSONObject result) {
						super.onPostExecute(result);
						//Acabo com a mensagem de carregando
						//progressDialog.dismiss();
						//Com a resposta json obtida, fazemos o parser para preencher o listview
						try {
							//Confere para ver se o resultado foi positivo
							upilist = new ArrayList<HashMap<String,String>>();
							if(result.getString("success").equals("1")){
								JSONArray json_upis_array = result.getJSONArray("upi");
								if(json_upis_array.isNull(0)){
									//Nao houve nenhuma UPI do usuario
									Toast.makeText(getApplicationContext(), "Usuario nao possui nenhuma UPI em sua mochila!", Toast.LENGTH_SHORT).show();
								}else{//Preenche o listview
									Integer i = Integer.valueOf(0);
									for(i = 0; i < json_upis_array.length(); i++){
										upi = new HashMap<String, String>();
										JSONObject json_upi = json_upis_array.getJSONObject(i);
										//upi.put("upiid", json_upi.getString("upiid"));
										upi.put("tipo_upi", json_upi.getString("tipo_upi"));
										upi.put("texto", json_upi.getString("texto"));
										upi.put("autor", json_upi.getString("autor"));
										upi.put("_id", json_upi.getString("upiid"));
										upilist.add(upi);
									}
								}
							}
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						//Hora de preencher o listview
						//Mas antes confere para ver se upilist possui algum item
						if(!upilist.isEmpty()){
							String campos[] = {"_id", "autor", "texto", "tipo_upi"};
							int layout[] = {R.id.tvIdUpi, R.id.tvAutor, R.id.tvTitulo, R.id.tvTipoUpi};
							ListAdapter listAdapter = new SimpleAdapter(getApplicationContext(), 
																			upilist, 
																			R.layout.adventure_bag_upi_row, 
																			campos, 
																			layout);
							
							try{
								listView.setAdapter(listAdapter);
							}catch(Exception e){
								e.printStackTrace();
							}
							
							listView.setLongClickable(true);
							listView.setOnItemLongClickListener(new OnItemLongClickListener() {
	
								public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
									//Aqui vou visualizar a UPI que esta na lista
									final AdapterView<?> av = parent;
									final int positionToDrop = position; 
									
									AlertDialog.Builder adb = new AlertDialog.Builder(context);
									//Log.e("DIALOG", "TESTE");
									adb.setTitle("Largar UPI");
									adb.setMessage("Largar UPI na aventura?");
									adb.setNegativeButton("Nao", null);
									adb.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
										
										public void onClick(DialogInterface dialog, int which) {
											//Toast.makeText(getApplicationContext(), "Dropar UPI " + id1, Toast.LENGTH_SHORT).show();
											HashMap<String, String> lista = new HashMap<String, String>();
											lista = (HashMap<String, String>)av.getItemAtPosition(positionToDrop);
											final String upiid = lista.get("_id").toString();
											//Mudando parametros para representar que larguei a UPI na aventura
											//Para isto preciso de uma thread assincrona
											new AsyncTask<Void, Void, JSONObject>(){
												
												ClicacaoFunctions clicacaoFunctions;
												
												@Override
												protected JSONObject doInBackground(
														Void... params) {
													clicacaoFunctions = new ClicacaoFunctions();
													JSONObject json = clicacaoFunctions.dropUpiToAdventure(upiid, aid, latitude, longitude);
													return json;
												}
	
												@Override
												protected void onPostExecute(
														JSONObject result) {
													//Analisa o JSON para ver se a operacao foi bem sucedida
													super.onPostExecute(result);
													
													try{
														if(result.getString("success").equalsIgnoreCase("1")){
															Toast.makeText(getApplicationContext(), "A UPI foi largada no mapa com sucesso!", Toast.LENGTH_SHORT).show();
														}else{
															Toast.makeText(getApplicationContext(), "Nao foi possivel largar a UPI", Toast.LENGTH_SHORT).show();
														}
													}catch(JSONException e){
														e.printStackTrace();
													}
													
													onDestroy();
													
												}
												
											}.execute();
										}
									});
									adb.show();
									
									return false;
								}
							
							});
							
							listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	
								public void onItemClick(AdapterView<?> parent, View view,
										int position, long id) {
									
									//Aqui vou visualizar a UPI que esta na lista
									final AdapterView<?> av = parent;
									final int positionToDrop = position;
									
									//Primeiro eu preciso ver se a UPI eh uma foto ou um som
									HashMap<String, String> lista = new HashMap<String, String>();
									lista = (HashMap<String, String>)av.getItemAtPosition(position);
									final String nome_upi = lista.get("texto").toString();
																		
									//Inicializando o alert dialog
									AlertDialog.Builder adb = new AlertDialog.Builder(context);
									
									if(nome_upi.startsWith("[FOTO]")){
										tipo_upi = "foto";
										mediaDir = Environment.getExternalStorageDirectory() + File.separator + "Clicacao/FOTOS/";
										mediaPath = "/www/clicacao/cliente/usuarios/fotos/";
										adb.setTitle("Visualizar FOTO");
										adb.setMessage("Deseja abrir a foto?");
									}else if(nome_upi.startsWith("[SOM]")){
										tipo_upi = "som";
										mediaDir = Environment.getExternalStorageDirectory() + File.separator + "Clicacao/SONS/";
										mediaPath = "/www/clicacao/cliente/usuarios/sons/";
										adb.setTitle("Ouvir SOM");
										adb.setMessage("Deseja ouvir o som?");
									}
									
									//Analisa se o diretorio existe, senao o cria
									File file  = new File(mediaDir);
									if(!file.exists()){
										file.mkdirs();
									}
									
									adb.setNegativeButton("Nao", null);
									adb.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
										public void onClick(DialogInterface dialog, int which) {
											//Ao clicar em sim inicia o download da imagem via FTP
											//Retorna o caminho para o arquivo no celular
											/*Primeiro vou analisar se a UPI esta no meu celular
											 * Se isto for verdade, basta retornar o caminho e inicializar a visao da UPI
											 * Senaum, preciso ir no servidor buscar o arquivo e entao inicializar nova tela
											 * */
											
											media = new File(mediaDir + nome_upi);
																						
											if(media.exists()){
												//O arquivo existe no celular
												//Basta verificar que tipo de arquivo eh ...
												if(tipo_upi.equals("som")){
													//Inicializa o player
													
													mediaPlayer = new MediaPlayer();
													try {
														mediaPlayer.setDataSource(mediaDir + nome_upi);
														mediaPlayer.prepare();
													} catch (IllegalArgumentException e) {
														e.printStackTrace();
													} catch (SecurityException e) {
														e.printStackTrace();
													} catch (IllegalStateException e) {
														e.printStackTrace();
													} catch (IOException e) {
														e.printStackTrace();
													}
													mediaPlayer.start();
													
													/* Este jeito eh mais oneroso, apesar de mais bonito de exibir
													Uri uri = Uri.parse(mediaDir + nome_upi);
													Intent i = new Intent(Intent.ACTION_VIEW, uri);
													i.setDataAndType(uri, "video/3gpp");
													startActivity(i);
													*/
												}else if(tipo_upi.equals("foto")){
													Intent i = new Intent(AdventureBagScreen.this, PhotoScreen.class);
													i.putExtra("mediaPath", mediaDir + nome_upi);
													AdventureBagScreen.this.startActivity(i);
												}
											}else{
												//O arquivo nao existe, preciso pega-lo no servidor
												
												new AsyncTask <Void, Void, Boolean>(){
													
													@Override
													protected Boolean doInBackground(
															Void... params) {
														
														FTPClient ftpClient = new FTPClient();
														FileOutputStream fos;
														Boolean result = false;
														
														try{
															ftpClient.connect("ftp.clicacao.com", 21);
															ftpClient.login("clicacao", "liedamadis");
															ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
															ftpClient.enterLocalPassiveMode();
															fos = new FileOutputStream(mediaDir + nome_upi);
															result = ftpClient.retrieveFile(mediaPath + nome_upi, fos);
															fos.close();
															ftpClient.logout();
															ftpClient.disconnect();
														}catch (SocketException e) {
															e.printStackTrace();
														} catch (IOException e) {
															e.printStackTrace();
														}
														
														return result;
													}

													@Override
													protected void onPostExecute(
															Boolean result) {
														super.onPostExecute(result);
														if(result){
															Toast.makeText(getApplicationContext(), "O arquivo foi baixado com sucesso!", Toast.LENGTH_SHORT).show();
															//Depois que o arquivo eh baixado, inicializa a tela de visualizacao ou o player
															if(tipo_upi.equals("som")){
																//Inicializa o player
																
																mediaPlayer = new MediaPlayer();
																try {
																	mediaPlayer.setDataSource(mediaDir + nome_upi);
																	mediaPlayer.prepare();
																} catch (IllegalArgumentException e) {
																	e.printStackTrace();
																} catch (SecurityException e) {
																	e.printStackTrace();
																} catch (IllegalStateException e) {
																	e.printStackTrace();
																} catch (IOException e) {
																	e.printStackTrace();
																}
																mediaPlayer.start();
																
																/* Este jeito eh mais oneroso, apesar de mais bonito de exibir
																Uri uri = Uri.parse(mediaDir + nome_upi);
																Intent i = new Intent(Intent.ACTION_VIEW, uri);
																i.setDataAndType(uri, "video/3gpp");
																startActivity(i);
																*/
															}else if(tipo_upi.equals("foto")){
																Intent i = new Intent(AdventureBagScreen.this, PhotoScreen.class);
																i.putExtra("mediaPath", mediaDir + nome_upi);
																AdventureBagScreen.this.startActivity(i);
															}
														}else{
															Toast.makeText(getApplicationContext(), "Nao foi possivel baixar o arquivo", Toast.LENGTH_SHORT).show();
														}
													}
													
												}.execute();
											}
										}
									});
									adb.show();
								}
							});
						}
					}
				}.execute();
			}
		});
		
		//Carrego as UPIs
		//Buscando o json no servidor com uma asynctask
		new AsyncTask<Void, Void, JSONObject>(){
			
			ClicacaoFunctions clicacaoFunctions;
			
			//private ProgressDialog progressDialog = new ProgressDialog(getApplicationContext());

			@Override
			protected JSONObject doInBackground(Void... params) {
				JSONObject json;
				clicacaoFunctions = new ClicacaoFunctions();
				json = clicacaoFunctions.getUserBagUpis(umid);
				return json;
			}
			
			@Override
			protected void onPreExecute() {
				super.onPreExecute();
				//progressDialog.setMessage("Carregando UPIs ...");
				//progressDialog.show();
			}

			@Override
			protected void onPostExecute(JSONObject result) {
				super.onPostExecute(result);
				//Acabo com a mensagem de carregando
				//progressDialog.dismiss();
				//Com a resposta json obtida, fazemos o parser para preencher o listview
				try {
					//Confere para ver se o resultado foi positivo
					upilist = new ArrayList<HashMap<String,String>>();
					if(result.getString("success").equals("1")){
						JSONArray json_upis_array = result.getJSONArray("upi");
						if(json_upis_array.isNull(0)){
							//Nao houve nenhuma UPI do usuario
							Toast.makeText(getApplicationContext(), "Usuario nao possui nenhuma UPI em sua mochila!", Toast.LENGTH_SHORT).show();
						}else{//Preenche o listview
							Integer i = Integer.valueOf(0);
							for(i = 0; i < json_upis_array.length(); i++){
								upi = new HashMap<String, String>();
								JSONObject json_upi = json_upis_array.getJSONObject(i);
								//upi.put("upiid", json_upi.getString("upiid"));
								upi.put("tipo_upi", json_upi.getString("tipo_upi"));
								upi.put("texto", json_upi.getString("texto"));
								upi.put("autor", json_upi.getString("autor"));
								upi.put("_id", json_upi.getString("upiid"));
								upilist.add(upi);
							}
						}
					}
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//Hora de preencher o listview
				//Primeiro verificamos se upilist foi preenchida
				if(!upilist.isEmpty()){
					String campos[] = {"_id", "autor", "texto", "tipo_upi"};
					int layout[] = {R.id.tvIdUpi, R.id.tvAutor, R.id.tvTitulo, R.id.tvTipoUpi};
					ListAdapter listAdapter = new SimpleAdapter(getApplicationContext(), 
																	upilist, 
																	R.layout.adventure_bag_upi_row, 
																	campos, 
																	layout);
					
					try{
						listView.setAdapter(listAdapter);
					}catch(Exception e){
						e.printStackTrace();
					}
					
					listView.setLongClickable(true);
					listView.setOnItemLongClickListener(new OnItemLongClickListener() {
	
						public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
							//Aqui vou visualizar a UPI que esta na lista
							final AdapterView<?> av = parent;
							final int positionToDrop = position; 
							
							AlertDialog.Builder adb = new AlertDialog.Builder(context);
							//Log.e("DIALOG", "TESTE");
							adb.setTitle("Largar UPI");
							adb.setMessage("Largar UPI na aventura?");
							adb.setNegativeButton("Nao", null);
							adb.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
								
								public void onClick(DialogInterface dialog, int which) {
									//Toast.makeText(getApplicationContext(), "Dropar UPI " + id1, Toast.LENGTH_SHORT).show();
									HashMap<String, String> lista = new HashMap<String, String>();
									lista = (HashMap<String, String>)av.getItemAtPosition(positionToDrop);
									final String upiid = lista.get("_id").toString();
									//Mudando parametros para representar que larguei a UPI na aventura
									//Para isto preciso de uma thread assincrona
									new AsyncTask<Void, Void, JSONObject>(){
										
										ClicacaoFunctions clicacaoFunctions;
										
										@Override
										protected JSONObject doInBackground(
												Void... params) {
											clicacaoFunctions = new ClicacaoFunctions();
											JSONObject json = clicacaoFunctions.dropUpiToAdventure(upiid, aid, latitude, longitude);
											return json;
										}
	
										@Override
										protected void onPostExecute(
												JSONObject result) {
											//Analisa o JSON para ver se a operacao foi bem sucedida
											super.onPostExecute(result);
											
											try{
												if(result.getString("success").equalsIgnoreCase("1")){
													Toast.makeText(getApplicationContext(), "A UPI foi largada no mapa com sucesso!", Toast.LENGTH_SHORT).show();
												}else{
													Toast.makeText(getApplicationContext(), "Nao foi possivel largar a UPI", Toast.LENGTH_SHORT).show();
												}
											}catch(JSONException e){
												e.printStackTrace();
											}
											
											onDestroy();
											
										}
										
									}.execute();
								}
							});
							adb.show();
							
							return false;
						}
					
					});
					
					listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	
						public void onItemClick(AdapterView<?> parent, View view,
								int position, long id) {
	
							//Aqui vou visualizar a UPI que esta na lista
							final AdapterView<?> av = parent;
							final int positionToDrop = position;
							
							//Primeiro eu preciso ver se a UPI eh uma foto ou um som
							HashMap<String, String> lista = new HashMap<String, String>();
							lista = (HashMap<String, String>)av.getItemAtPosition(position);
							final String nome_upi = lista.get("texto").toString();
																
							//Inicializando o alert dialog
							AlertDialog.Builder adb = new AlertDialog.Builder(context);
							
							if(nome_upi.startsWith("[FOTO]")){
								tipo_upi = "foto";
								mediaDir = Environment.getExternalStorageDirectory() + File.separator + "Clicacao/FOTOS/";
								mediaPath = "/www/clicacao/cliente/usuarios/fotos/";
								adb.setTitle("Visualizar FOTO");
								adb.setMessage("Deseja abrir a foto?");
							}else if(nome_upi.startsWith("[SOM]")){
								tipo_upi = "som";
								mediaDir = Environment.getExternalStorageDirectory() + File.separator + "Clicacao/SONS/";
								mediaPath = "/www/clicacao/cliente/usuarios/sons/";
								adb.setTitle("Ouvir SOM");
								adb.setMessage("Deseja ouvir o som?");
							}
							
							//Analisa se o diretorio existe, senao o cria
							File file  = new File(mediaDir);
							if(!file.exists()){
								file.mkdirs();
							}
							
							adb.setNegativeButton("Nao", null);
							adb.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog, int which) {
									//Ao clicar em sim inicia o download da imagem via FTP
									//Retorna o caminho para o arquivo no celular
									/*Primeiro vou analisar se a UPI esta no meu celular
									 * Se isto for verdade, basta retornar o caminho e inicializar a visao da UPI
									 * Senaum, preciso ir no servidor buscar o arquivo e entao inicializar nova tela
									 * */
									
									media = new File(mediaDir + nome_upi);
																				
									if(media.exists()){
										//O arquivo existe no celular
										//Basta verificar que tipo de arquivo eh ...
										if(tipo_upi.equals("som")){
											//Inicializa o player
											
											mediaPlayer = new MediaPlayer();
											try {
												mediaPlayer.setDataSource(mediaDir + nome_upi);
												mediaPlayer.prepare();
											} catch (IllegalArgumentException e) {
												e.printStackTrace();
											} catch (SecurityException e) {
												e.printStackTrace();
											} catch (IllegalStateException e) {
												e.printStackTrace();
											} catch (IOException e) {
												e.printStackTrace();
											}
											mediaPlayer.start();
											
											/* Este jeito eh mais oneroso, apesar de mais bonito de exibir
											Uri uri = Uri.parse(mediaDir + nome_upi);
											Intent i = new Intent(Intent.ACTION_VIEW, uri);
											i.setDataAndType(uri, "video/3gpp");
											startActivity(i);
											*/
										}else if(tipo_upi.equals("foto")){
											Intent i = new Intent(AdventureBagScreen.this, PhotoScreen.class);
											i.putExtra("mediaPath", mediaDir + nome_upi);
											AdventureBagScreen.this.startActivity(i);
										}
									}else{
										//O arquivo nao existe, preciso pega-lo no servidor
										
										new AsyncTask <Void, Void, Boolean>(){
											
											@Override
											protected Boolean doInBackground(
													Void... params) {
												
												FTPClient ftpClient = new FTPClient();
												FileOutputStream fos;
												Boolean result = false;
												
												try{
													ftpClient.connect("ftp.clicacao.com", 21);
													ftpClient.login("clicacao", "liedamadis");
													ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
													ftpClient.enterLocalPassiveMode();
													fos = new FileOutputStream(mediaDir + nome_upi);
													result = ftpClient.retrieveFile(mediaPath + nome_upi, fos);
													fos.close();
													ftpClient.logout();
													ftpClient.disconnect();
												}catch (SocketException e) {
													e.printStackTrace();
												} catch (IOException e) {
													e.printStackTrace();
												}
												
												return result;
											}

											@Override
											protected void onPostExecute(
													Boolean result) {
												super.onPostExecute(result);
												if(result){
													Toast.makeText(getApplicationContext(), "O arquivo foi baixado com sucesso!", Toast.LENGTH_SHORT).show();
													//Depois que o arquivo eh baixado, inicializa a tela de visualizacao ou o player
													if(tipo_upi.equals("som")){
														//Inicializa o player
														
														mediaPlayer = new MediaPlayer();
														try {
															mediaPlayer.setDataSource(mediaDir + nome_upi);
															mediaPlayer.prepare();
														} catch (IllegalArgumentException e) {
															e.printStackTrace();
														} catch (SecurityException e) {
															e.printStackTrace();
														} catch (IllegalStateException e) {
															e.printStackTrace();
														} catch (IOException e) {
															e.printStackTrace();
														}
														mediaPlayer.start();
														
														/* Este jeito eh mais oneroso, apesar de mais bonito de exibir
														Uri uri = Uri.parse(mediaDir + nome_upi);
														Intent i = new Intent(Intent.ACTION_VIEW, uri);
														i.setDataAndType(uri, "video/3gpp");
														startActivity(i);
														*/
														
													}else if(tipo_upi.equals("foto")){
														Intent i = new Intent(AdventureBagScreen.this, PhotoScreen.class);
														i.putExtra("mediaPath", mediaDir + nome_upi);
														AdventureBagScreen.this.startActivity(i);
													}
												}else{
													Toast.makeText(getApplicationContext(), "Nao foi possivel baixar o arquivo", Toast.LENGTH_SHORT).show();
												}
											}
											
										}.execute();
									}
								}
							});
							adb.show();
						}
				
					});
				}
			}
		}.execute();
		
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		this.finish();
	}	
}
